home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbdatabs / hxcrc.cpp < prev    next >
C/C++ Source or Header  |  1999-03-17  |  5KB  |  167 lines

  1. // ------------------------------- //
  2. // -------- Start of File -------- //
  3. // ------------------------------- //
  4. // ----------------------------------------------------------- // 
  5. // C++ Source Code File Name: crc.cpp 
  6. // Compiler Used: MSVC40, DJGPP 2.7.2.1, GCC 2.7.2.1, HP CPP 10.24
  7. // Produced By: Doug Gaer 
  8. // File Creation Date: 08/17/1998 
  9. // Date Last Modified: 03/17/1999
  10. // ----------------------------------------------------------- // 
  11. // ------------- Program description and details ------------- // 
  12. // ----------------------------------------------------------- // 
  13. /*
  14. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
  15. THE ENTIRE RISK OF THE QUALITY AND PERFORMANCE OF THIS SOFTWARE
  16. IS WITH YOU. SHOULD ANY ELEMENT OF THIS SOFTWARE PROVE DEFECTIVE,
  17. YOU WILL ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
  18. CORRECTION.
  19.   
  20. The CRC Class (Cyclic Redundancy Check) is used to calculate a
  21. sophisticated checksum based on the algebra of polynomials over
  22. the integers (mod 2). The Cyclic Redundancy Check, is a way to
  23. detect bit errors that occur during data storage or transmission.
  24. The CRC algorithm operates on a block of data as a single large
  25. numerical value. The algorithm divides this large value by the
  26. CRC polynomial or generator polynomial, leaving the remainder,
  27. which is the CRC result. 
  28. */
  29. // ----------------------------------------------------------- // 
  30. #include "hxcrc.h"
  31.  
  32. hxCRC::hxCRC()
  33. {
  34.   // Initialize all the CRC tables
  35.   crc32init();
  36.   crc16init();
  37.   crc16CCITTinit();
  38. }
  39.  
  40. void hxCRC::crc32init()
  41. // Write a CRC-32 table for a byte-wise 32-bit CRC calculation
  42. // based on the Autodin/Ethernet/ADCCP polynomial of 0x4C11DB7:
  43. // 0000 0100 1100 0001 0001 1101 1011 0111 
  44. // In this representation the coefficient of x^0 is stored in the 
  45. // MSB of the 32-bit word and the coefficient of x^31 is stored in 
  46. // the LSB. Thus 0x4C11DB7 becomes 0xEDB88320:
  47. // 1110 1101 1011 1000 1000 0011 0010 0000
  48. {
  49.   int i,n;
  50.   unsigned long CRC32;
  51.   for (i = 0; i < 256; i++) {
  52.     CRC32=i;
  53.     for (n = 1; n < 9; n++) {
  54.       if (CRC32 & 1)
  55.     CRC32 = (CRC32 >> 1) ^ 0xedb88320;
  56.       else
  57.     CRC32 = CRC32 >> 1;
  58.     }
  59.     crc32tab[i] = CRC32;
  60.   }
  61. }
  62.  
  63. void hxCRC::crc16init()
  64. // Write a CRC-16 table for a byte-wise 16-bit CRC calculation
  65. // based on the XModem/Zmodem/Arc/Hpack/LZH polynomial of 0x8005:
  66. // 1000 0000 0000 0101
  67. // In this representation the coefficient of x^0 is stored in the
  68. // MSB of the 16-bit word and the coefficient of x^15 is stored in
  69. // the LSB. Thus 0x8005 becomes 0xA001:
  70. // 1010 0000 0000 0001
  71. {
  72.   int i,n;
  73.   unsigned short CRC16;
  74.  
  75.   for (i = 0; i < 256; i++) {
  76.     CRC16=i;
  77.     for (n = 1; n < 9; n++) {
  78.       if (CRC16 & 1)
  79.     CRC16=(CRC16 >> 1) ^ 0xA001;
  80.       else
  81.     CRC16=CRC16 >> 1;
  82.     }
  83.     crc16tab[i]=CRC16;
  84.   }
  85. }
  86.  
  87. void hxCRC::crc16CCITTinit()
  88. // Write a CRC-16 table for a byte-wise 16-bit CRC calculation
  89. // based on the CCITT CRC-16/AX.25 polynomial of 0x1021:
  90. // 0001 0000 0010 0001
  91. // In this representation the coefficient of x^0 is stored in the
  92. // MSB of the 16-bit word and the coefficient of x^15 is stored in
  93. // the LSB. Thus 0x8005 becomes 0x8408:
  94. // 1000 01000 0000 1000
  95. {
  96.   int i,n;
  97.   unsigned short CRC16;
  98.   for (i = 0; i < 256; i++) {
  99.     CRC16=i;
  100.     for (n = 1; n < 9; n++) {
  101.       if (CRC16 & 1)
  102.     CRC16=(CRC16 >> 1) ^ 0x8408;
  103.       else
  104.     CRC16=CRC16 >> 1;
  105.     }
  106.     crc16CCITT[i]=CRC16;
  107.   }
  108. }
  109.  
  110. unsigned long hxCRC::calcCRC32(fstream &infile)
  111. // Calculate the CRC-32 of a file. Returns
  112. // the checksum value.
  113. {
  114.  unsigned long CRC = 0xffffffffL;
  115.  unsigned char c;
  116.  unsigned int i;
  117.  
  118.  // Rewind to the start of the stream
  119.  infile.clear(); 
  120.  infile.seekg(0, ios::beg);
  121.  infile.seekp(0, ios::beg);
  122.  
  123.  while(!infile.eof()) {
  124.    infile.get(c);
  125.    i = (unsigned int)c;
  126.    i &= 0xFF; // Reset all the bits
  127.    if(infile.eof()) break;
  128.    CRC = crc32tab[(CRC ^ i) & 0xFF] ^ ((CRC>>8) & 0x00ffffffL);
  129.  }
  130.  return CRC ^ 0xffffffffL;
  131. }
  132.  
  133. unsigned short hxCRC::calcCRC16(fstream &infile, int mode)
  134. // Calculate a 16-bit CRC for a file. If the mode
  135. // variable is set to zero, a checksum based on the
  136. // CCITT CRC-16/AX.25 polynomial is returned. If the
  137. // mode variable is set to one, a checksum based on the
  138. // XModem/Zmodem/Arc/Hpack/LZH polynomial is returned.
  139. {
  140.  unsigned short CRC = 0xffff;
  141.  if(mode == 1) CRC = 0; 
  142.  unsigned char c;
  143.  unsigned short i;
  144.  
  145.   // Rewind to the start of the stream
  146.  infile.clear(); 
  147.  infile.seekg(0, ios::beg);
  148.  infile.seekp(0, ios::beg);
  149.  
  150.  while(!infile.eof()) {
  151.    infile.get(c);
  152.    i = (unsigned short)c;
  153.    i &= 0xFF; // Reset all the bits
  154.    if(infile.eof()) break;
  155.    if (mode==1)
  156.     CRC = ((CRC >> 8) & 0x00ff) ^ crc16tab[(CRC ^ i) & 0x00ff];
  157.    else
  158.      CRC = ((CRC >> 8) & 0x00ff) ^ crc16CCITT[(CRC ^ i) & 0x00ff];
  159.  }
  160.  if (mode == 1) return CRC;
  161.  return CRC ^ 0xffff;
  162. }
  163. // ----------------------------------------------------------- // 
  164. // ------------------------------- //
  165. // --------- End of File --------- //
  166. // ------------------------------- //
  167.